#include <ctype.h>
#include <stdlib.h>
#include <string.h>
#include "tar.h"
#include "options.h"


static void SetDevice(char **cp) {
  if (!UnixArchive)
    MultipleVolumes = 1;
  driveno = **cp - '0';
  switch (*(*cp + 1)) {
    case 'D':
    case 'E':
    case 'F':
    case 'L':
    case 'M':
    case 'Q':
    case 'H':
    case 'N':
      format = *(++*cp);
      break;
    default:
      fprintf(stderr, "tar: %c: unknown disc format\n", *(*cp + 1));
      Terminate(25);
  }
} /* SetDevice */


static tapedevice_t CheckDevNames(char *TestName) {
  char *cp;
  char lowername[256];

  cp = lowername;
  while (*TestName) {
    *cp++ = toupper(*TestName++);
  }
  if (strncmp(lowername, "RMT:", 4) == 0) {
    return tapedevice_RMT;
  }
  if (strncmp(lowername, "FLOPPY:", 7) != 0) {
    return tapedevice_FILE;
  }
  if (lowername[7] != '0' && lowername[7] != '1') {
    return tapedevice_FILE;
  }
  cp = lowername + 7;
  SetDevice(&cp);
  return tapedevice_DISC;
} /* CheckDevNames */


int CheckOption(char **cp, char *next) {
  int NextCnt;

  NextCnt = 0;
  switch(**cp) {
    case ' ':
    case '-':
      break;
    case '0':
    case '1':
    case '2':
    case '3':
      fprintf(stderr,
"tar: warning: obsolete option '%c' use 'f' with device name instead\n",**cp);
      SetDevice(cp);
      break;
    case 'b':
      if (next == NULL) {
        fprintf(stderr,"tar: blocksize must be specified with 'b' option\n");
        usage();
      }
      nblock = atoi(next);
      if (nblock <= 0) {
        fprintf(stderr,"tar: invalid blocksize \"%s\"\n",next);
        Terminate(7);
      }
      NextCnt++;
      break;
    case 'c':
      CreateArchive = 1;
      AppendToArchive = 1;
      break;
    case 'e':
      if (next == NULL) {
        fprintf(stderr,"tar: extension length must be specified with 'e' option\n");
        usage();
      }
      MaxExtLength = atoi(next);
      NextCnt++;
      break;
    case 'f':
      if (next == NULL) {
        fprintf(stderr,"tar: tapefile must be specified with 'f' option\n");
        usage();
      }
      tapedevice = CheckDevNames(next);
      switch (tapedevice) {
        case tapedevice_FILE:
          ArchiveName = next;
          break;
        case tapedevice_RMT:
          ArchiveName = next + 4;
          break;
      }
      ArchiveFileSpecified = 1;
      NextCnt++;
      break;
    case 'i':
      IgnoreArchiveErrors = 1;
      break;
    case 'l':
      UseListFile = 1;
      if (next != NULL) {
        listfile = next;
        NextCnt++;
      }
      break;
    case 'm':
      DoNotExtractFileDates = 1;
      break;
    case 'p':
      ConvertExclamationMark = 1;
      break;
    case 'r':
      AppendToArchive = 1;
      break;
    case 's':
      SwapExtensionToDir = 1;
      break;
    case 't':
      ListArchivesContents = 1;
      break;
    case 'v':
      Verbose = 1;
      break;
    case 'w':
      ConfirmActions = 1;
      break;
    case 'x':
      ExtractFromArchive = 1;
      break;
    case 'z':
      CompressFiles = 1;
      break;
    case 'B':
      Reblock = 1;
      break;
    case 'E':
      PeriodSlashConversion = 1;
      break;
    case 'F':
      FormatFloppies = 1;
      break;
    case 'M':
      MultipleVolumes = 1;
      break;
    case 'L':
      if (next == NULL) {
        fprintf(stderr,"tar: maximum leaf length must be specified with 'L' option\n");
        usage();
      }
      MaxLeafLength = atoi(next);
      NextCnt++;
      break;
    case 'O':
      NoDiskDestroyConfirmation = 1;
      break;
    case 'P':
      UseCanonicalisedPaths = 1;
      break;
    case 'Q':
      QuietExecution = 1;
      break;
    case 'S':
      SwapInWholePath = 1;
      break;
    case 'T':
      CommaFileTypes = 1;
      break;
    case 'U':
      UnixArchive = 1;
      MultipleVolumes = 0;
      break;
    case 'V':
      VeryVerbose = 1;
      Verbose = 1;
      break;
    case 'X':
      AddFileTypeExtension = 1;
      break;
    case 'Z':
      ConvertCompressExtension = 1;
      break;
    default:
      fprintf(stderr, "tar: %c: unknown option\n", **cp);
      usage();
  }
  return NextCnt;
} /* CheckOption */
